package ventanas;

import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import clasesBasicas.Global;
import clasesBasicas.Noticia;
import utilidades.Reader;

import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;




import javax.swing.JLabel;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Desktop;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.AbstractListModel;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class PanelNoticias extends JPanel {
	private JTextField textField;
	private ArrayList<String>aLinkMot;
	private ArrayList<String>aLinkDep;
	private ArrayList<String>aLinkSoc;
	private ArrayList<String>aLinkNot;
	
	private static Reader r; 
	private static Reader r1;
	private static Reader r2;
	private static Reader r3;
	
	private static JPanel panelResult;
	private static JTabbedPane tabbedPane;
	
	private static JTextField textSearch;
	private static JList<String>listaRes;

	/**
	 * ArrayList que guarda los resultados de la búsqueda 
	 */
	private static ArrayList<Noticia> results;
	private static ArrayList<String>aLinkResult;
	
	private static ArrayList<Noticia> aux;
	private static ArrayList<Noticia> aux1;
	private static ArrayList<Noticia> aux2;
	private static ArrayList<Noticia> aux3;
	public static boolean primeraVez= true;

	/**
	 * Create the panel.
	 * @throws Exception 
	 */
	public PanelNoticias()  {
		
		
		r = new Reader();
		aLinkMot=new ArrayList<>();
		aLinkDep=new ArrayList<>();
		aLinkSoc=new ArrayList<>();
		aLinkNot=new ArrayList<>();
		setLayout(new BorderLayout(0, 0));
		
		//Se inicializa el JTextField de buscar datos.
		textSearch= new JTextField("Buscar...");
		textSearch.setLayout(null);
		this.add(textSearch, "North");

		// Borrar texto cuando hace click en el TextField
		textSearch.addMouseListener(new MouseAdapter(){
			@Override
			public void mouseClicked(MouseEvent e){
				if (textSearch.getText().equals("Buscar...")) {
					textSearch.setText("");            		
				}

			}
		});

		/////

		// Buscar cuando el usuario interactúa con el TextField
		textSearch.getDocument().addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				String texto=textSearch.getText();
				System.out.println("Aqui texto: "+texto+"viste?");
				if(texto.equals("") && !primeraVez)
				{
					System.out.println("aqui guey");
					Global.pNot.remove(panelResult);
				}
				else
				{
				buscar(this);
				}
			}

			@Override
			public void insertUpdate(DocumentEvent arg0) {
				String texto=textSearch.getText();
				System.out.println("Aqui texto: "+texto+"viste?");
				if( texto.equals("") && !primeraVez)
				{
					System.out.println("aqui guey");
					Global.pNot.remove(panelResult);
				}
				else
				{
				buscar(this);
				}
			}

			@Override
			public void removeUpdate(DocumentEvent arg0) {
				String texto=textSearch.getText();
				System.out.println("Aqui texto: "+texto+"viste?");
				if( texto.equals("") && !primeraVez)
				{
					System.out.println("aqui guey");
					//Global.pNot.remove(panelResult);
					tabbedPane.setVisible(true);
					panelResult.setVisible(false);
				}
				else
				{
					if(!primeraVez)
					{
						buscar(this);
					}
				}
				
			}

		});

		//
		
		
		panelResult = new JPanel();
		panelResult.setLayout(new BorderLayout(0, 0));
		add(panelResult, "Center");
		
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		add(tabbedPane, "Center");
		tabbedPane.setVisible(true);
		
		JPanel panelEconomia = new JPanel();
		tabbedPane.addTab("Economía", null, panelEconomia, null);
		panelEconomia.setLayout(new BorderLayout(0, 0));
		
		
		
		try {
			aux = r.noticias("http://www.eleconomista.es/rss/rss-economia.php");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

		//Crear un objeto DefaultListModel
		DefaultListModel listModel = new DefaultListModel();
		//Recorrer el contenido del ArrayList
		final JList listaNot = new JList<>();
		
		listaNot.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				int p=listaNot.getSelectedIndex();
				String link=aLinkNot.get(p);
				Desktop d=Desktop.getDesktop();;
				try {
					d.browse(URI.create(link));
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(null, "No se ha podido acceder a la web seleccionada. Compruebe su conexión a internet.", "Error al acceder a la Web", JOptionPane.ERROR_MESSAGE, null);
				}
			}
		});
		
		
		

		JScrollPane scrollPane = new JScrollPane(listaNot);
		panelEconomia.add(scrollPane, BorderLayout.CENTER);
		

		for(int i=0; i< aux.size(); i++) {

			//Añadir cada elemento del ArrayList en el modelo de la lista
			aLinkNot.add(i, aux.get(i).getUrl());
			listModel.add(i, aux.get(i).getTitulo());
			

		}

		//Asociar el modelo de lista al JList

		listaNot.setModel(listModel);
//		
		
			
		JPanel panelDeportes = new JPanel();
		tabbedPane.addTab("Deportes", null, panelDeportes, null);
		panelDeportes.setLayout(new BorderLayout(0, 0));
		
		r1 = new Reader();
		
		
		try {
			aux1 = r1.noticias("http://feeds.feedburner.com/mundodeportivo-titulares?format=xml");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

		//Crear un objeto DefaultListModel
		DefaultListModel listModelDep = new DefaultListModel();
		//Recorrer el contenido del ArrayList
		final JList listaDep = new JList<>();
		
		listaDep.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				int p=listaDep.getSelectedIndex();
				String link=aLinkDep.get(p);
				Desktop d = Desktop.getDesktop();
				try {
					d.browse(URI.create(link));
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(null, "No se ha podido acceder a la web seleccionada. Compruebe su conexión a internet.", "Error al acceder a la Web", JOptionPane.ERROR_MESSAGE, null);
				}
			}
		});
		
		
		
		JScrollPane scrollPaneDep = new JScrollPane(listaDep);
		panelDeportes.add(scrollPaneDep, BorderLayout.CENTER);
		

		for(int i=0; i< aux1.size(); i++) {

			//Añadir cada elemento del ArrayList en el modelo de la lista
			aLinkDep.add(i, aux1.get(i).getUrl());
			listModelDep.add(i, aux1.get(i).getTitulo());

		}

		//Asociar el modelo de lista al JList

		listaDep.setModel(listModelDep);
		
		
		
				
		JPanel panelMotor = new JPanel();
		tabbedPane.addTab("Motor", null, panelMotor, null);
		panelMotor.setLayout(new BorderLayout(0, 0));
		
		r2 = new Reader();
		
		
		try {
			aux2 = r2.noticias("http://www.autobild.es/noticias/rss");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

		//Crear un objeto DefaultListModel
		DefaultListModel listModelMot = new DefaultListModel();
		//Recorrer el contenido del ArrayList
		final JList listaMot = new JList<>();
		

		JScrollPane scrollPaneMot = new JScrollPane(listaMot);
		panelMotor.add(scrollPaneMot, BorderLayout.CENTER);
		
		listaMot.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				int p=listaMot.getSelectedIndex();
				String link=aLinkMot.get(p);
				Desktop d = Desktop.getDesktop();
				try {
					d.browse(URI.create(link));
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(null, "No se ha podido acceder a la web seleccionada. Compruebe su conexión a internet.", "Error al acceder a la Web", JOptionPane.ERROR_MESSAGE, null);
				}
			}
		});
		for(int i=0; i< aux2.size(); i++) {

			//Añadir cada elemento del ArrayList en el modelo de la lista
			aLinkMot.add(i, aux2.get(i).getUrl());
			listModelMot.add(i, aux2.get(i).getTitulo());

		}

		//Asociar el modelo de lista al JList

		listaMot.setModel(listModelMot);
		
		
		
		JPanel panelSociedad = new JPanel();
		tabbedPane.addTab("Sociedad", null, panelSociedad, null);
		panelSociedad.setLayout(new BorderLayout(0, 0));
		
		r3 = new Reader();
		
		
		try {
			aux3 = r1.noticias("http://www.abc.es/rss/feeds/abc_Sociedad.xml");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

		//Crear un objeto DefaultListModel
		DefaultListModel listModelSoc = new DefaultListModel();
		//Recorrer el contenido del ArrayList
		final JList listaSoc = new JList<>();
		
		
		listaSoc.addMouseListener(new MouseListener() {
			
			@Override
			public void mouseReleased(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseExited(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void mouseClicked(MouseEvent e) {
				int p=listaSoc.getSelectedIndex();
				String link=aLinkSoc.get(p);
				Desktop d = Desktop.getDesktop();
				try {
					d.browse(URI.create(link));
				} catch (IOException e1) {
					JOptionPane.showMessageDialog(null, "No se ha podido acceder a la web seleccionada. Compruebe su conexión a internet.", "Error al acceder a la Web", JOptionPane.ERROR_MESSAGE, null);
				}
			}
		});
		

		JScrollPane scrollPaneSoc = new JScrollPane(listaSoc);
		panelSociedad.add(scrollPaneSoc, BorderLayout.CENTER);
		

		for(int i=0; i< aux3.size(); i++) {

			//Añadir cada elemento del ArrayList en el modelo de la lista
			aLinkSoc.add(i, aux3.get(i).getUrl());
			listModelSoc.add(i, aux3.get(i).getTitulo());

		}

		//Asociar el modelo de lista al JList

		listaSoc.setModel(listModelSoc);
		
		
		
		
	}
	
	public static void buscar(DocumentListener documentListener) {	
		String texto=textSearch.getText();
		System.out.println(texto);
		System.out.println(primeraVez);
			System.out.println("ya he pasado");
			aLinkResult = new ArrayList<String>();
			
			if (results != null) {		
				results.clear();
			} else {
				results = new ArrayList<Noticia>(); // Aquí guardamos los botones que mostrarán los elementos resultado.
			}
			
			int totalResults = 0;
	
	
			//Busqueda de los circuitos que coincidan con el texto introducido
			for (int i = 0; i < r.getContador(); i++) {
				
	
				if (aux.get(i).getTitulo().toLowerCase().startsWith(textSearch.getText().toLowerCase())) {
					totalResults ++;// Aumentamos el contador de resultados
					System.out.println(aux.get(i).getTitulo());
					results.add(aux.get(i));
	
				}
			}
			
			//Busqueda de los circuitos que coincidan con el texto introducido
			for (int i = 0; i < r1.getContador(); i++) {
	
	
				if (aux1.get(i).getTitulo().toLowerCase().startsWith(textSearch.getText().toLowerCase())) {
					totalResults ++;// Aumentamos el contador de resultados
					System.out.println(aux1.get(i).getTitulo());
					results.add(aux1.get(i));
	
				}
			}
	
			//Busqueda de los circuitos que coincidan con el texto introducido
			for (int i = 0; i < r2.getContador(); i++) {
	
	
				if (aux2.get(i).getTitulo().toLowerCase().startsWith(textSearch.getText().toLowerCase())) {
					totalResults ++;// Aumentamos el contador de resultados
					System.out.println(aux2.get(i).getTitulo());
					results.add(aux2.get(i));
	
				}
			}
	
			//Busqueda de los circuitos que coincidan con el texto introducido
			for (int i = 0; i < r3.getContador(); i++) {
	
	
				if (aux3.get(i).getTitulo().toLowerCase().startsWith(textSearch.getText().toLowerCase())) {
					totalResults ++;// Aumentamos el contador de resultados
					System.out.println(aux3.get(i).getTitulo());
					results.add(aux3.get(i));
	
				}
			}
	
			
			
			listaRes = new JList<String>();
			DefaultListModel<String> listModelRes = new DefaultListModel<String>();
			
			if(!primeraVez)
			{
			panelResult.remove(0);
			}
			
			JScrollPane scrollPaneResult = new JScrollPane(listaRes);
			panelResult.add(scrollPaneResult, BorderLayout.CENTER);
			
	
			for(int i=0; i< results.size(); i++) {
				System.out.println("añado");
				System.out.println(results.get(i).getUrl());
				//Añadir cada elemento del ArrayList en el modelo de la lista
				aLinkResult.add(i, results.get(i).getUrl());
				System.out.println(results.get(i).getUrl());
				listModelRes.add(i, results.get(i).getTitulo());
			}
	
			//Asociar el modelo de lista al JList
	
			listaRes.setModel(listModelRes);
	
			listaRes.addMouseListener(new MouseListener() {
	
				@Override
				public void mouseReleased(MouseEvent e) {
					// TODO Auto-generated method stub
	
				}
	
				@Override
				public void mousePressed(MouseEvent e) {
					// TODO Auto-generated method stub
	
				}
	
				@Override
				public void mouseExited(MouseEvent e) {
					// TODO Auto-generated method stub
	
				}
	
				@Override
				public void mouseEntered(MouseEvent e) {
					// TODO Auto-generated method stub
	
				}
	
				@Override
				public void mouseClicked(MouseEvent e) {
					int p=listaRes.getSelectedIndex();
					String link=aLinkResult.get(p);
					Desktop d = Desktop.getDesktop();
					try {
						d.browse(URI.create(link));
					} catch (IOException e1) {
						JOptionPane.showMessageDialog(null, "No se ha podido acceder a la web seleccionada. Compruebe su conexión a internet.", "Error al acceder a la Web", JOptionPane.ERROR_MESSAGE, null);
					}
				}
			});
	
			//Ahora hay que poner en el centro otro panel con solo los resultados de results.
			// Mostramos los resultados
			//if(PanelNoticias.primeraVez)
			//{
			Global.pNot.add(panelResult,"Center");
			primeraVez=false;
			//}
			//else
			//{
				//Global.pNot.removeAll();
				//Global.pNot.add(panelResult,"Center");
			//}
			panelResult.updateUI();
			tabbedPane.setVisible(false);
			panelResult.setVisible(true);

	}
	
	

	public static void main(String []args) throws Exception{
		JFrame p = new JFrame();
		p.setSize(600, 600);
		p.setVisible(true);
		p.getContentPane().setLayout(new BorderLayout());
		PanelNoticias pNot = new PanelNoticias();
		p.add(pNot,"Center");
		
		
	}
}
